FIT2-2023b 第09回 ミニプロ実習 + 詳細設計書解説
アナウンス
12/20(水) 中間発表です
4~5人のグループに分かれて実施
企画書及び現行の成果物を各自発表 (3~5分目安)
発表者に対して他メンバより改善提案/フィードバックを実施(3~5分)
12/27(水) はリモート開催とします
講義なし、事前予約制でひたすらミニプロのサポートをやります
以下から予約登録を! (当日受付不可)
予約URL ※01/03, 01/10の枠は表出してますが非開催日です 本日の講義
複雑なプロセスを構造化して表現するために便利な表現方法
端子、処理、判断、定義済み処理の4つを押さえればまずは書ける
https://gyazo.com/d4b4b16627cc9ab86ca5861dbbc62325
https://gyazo.com/3b567bbf18808bbad4091bffe7a66d4a
課題b-12-3をフローチャートに落としてみます
code:python
import pyxel
class Pad:
def __init__(self):
self.x = 100
def move(self):
self.x = pyxel.mouse_x
def draw(self):
# 幅が40pxなので、長方形の描画起点はpadx-20になる
pyxel.rect(self.x - 20, 195, 40, 5, 14)
def catch(self, ball):
if ball.y >= 195 and self.x - 20 <= ball.x <= self.x + 20:
return True
else:
return False
class Ball:
# ここに書くとボールの共通概念として値を定義できる (クラス変数)
speed = 1
def __init__(self): # ボールを新しく生成したときの初期化処理をここに書く
# self.XX と書くことで、各ボールの固有値を保存できる
self.x = pyxel.rndi(0, 199)
self.y = 0
self.angle = pyxel.rndi(30, 150)
self.vx = pyxel.cos(self.angle)
self.vy = pyxel.sin(self.angle)
def reset(self): # ボールを上に戻す処理をここに書く
self.x = pyxel.rndi(0, 199)
self.y = 0
def move(self):
# ボールが毎フレーム動くときの挙動をここに書く
self.x = self.x + self.vx * Ball.speed # speedだけボール共通の値なので Ball.speed になる
self.y = self.y + self.vy * Ball.speed # speedだけボール共通の値なので Ball.speed になる
# 移動後に両端に届いていたらx方向の動きを反転させる
if self.x <= 0 or 200 <= self.x:
self.vx = self.vx * -1
def draw(self):
# ボールを画面に描画するときの処理をここに書く
pyxel.circ(self.x, self.y, 10, 6)
def speedup(self):
Ball.speed = Ball.speed + 0.5
pyxel.init(200, 200)
balls = Ball() # ballsという変数に、ボールを一つ生成して格納する score = 0 # 点数
miss = 0 # 失敗した回数を記録する変数
success = 0 # キャッチに成功した回数を記録する変数
gameover = False # ゲームオーバーかどうかを記録する変数
pad = Pad()
def update():
global balls, score, miss, success, gameover, pad
if gameover:
# 処理を何もせずupdateをここで処理中断する
# ゲームオーバー後は内部処理が止まるように
return
# padの座標更新は1回で良いのでfor文の外
pad.move()
# ボールの数だけ以下処理を回す
for a in balls:
# ボールのy座標が195 (padの上端)より下にいる
# なおかつ、ボールのx座標がpadの左端(padx-20)と右端(padx+20)の間にある場合に
if pad.catch(a):
# 点数を100増やす
score = score + 100
success = success + 1
if success >= 10:
# ボールを増やす
balls.append(Ball())
# スピードをもとに戻す
Ball.speed = 1
# successも0に戻す
success = 0
# 接触後、ボールを上に戻してあげないと、そのまま進み続けて連続ヒットしてしまう
a.reset()
a.speedup()
if a.y >= 200: # ボールが下端まで来たら
# 失敗カウントを増やす
miss = miss + 1
if miss >= 10:
gameover = True
a.reset() # ボールを上に戻し、x座標をランダムに再設定
a.speedup()
def draw():
global balls, pad, score, miss, gameover, success
if gameover:# ゲームオーバーだったら…
# pyxel.cls(7) をあえて実行しないことで、前回処理時の画面をそのまま表示する
pyxel.text(50, 100, "GAME OVER", 0)
pyxel.cls(7)
for a in balls:
a.draw()
pad.draw()
pyxel.text(0, 0, str(score), 0)
pyxel.run(update, draw)
作成した図形は以下のようにgoogle docsに挿入可能です
https://gyazo.com/f78e919429fd3264f4244935f2d25242
描画領域が狭い場合は ファイル > ページ設定 > カスタム で拡張可能
https://gyazo.com/58b6f09fcef284bb99b5b0157e239a36